D8 a marshaling "char**"
Otázka od: Lukas Gebauer
15. 7. 2004 10:58
Mam problem...
Z D8 pres PInvoke volam nejake DLLka.
Pokud je parametr typu "char*", tak to uspesne zmarshaluju pres
string a stringbuilder.
Jen si nevim rady co si pocit s typem "char**". Ve starych delphi
staci pouzit "var pchar". Jak to ale udelat v D8?
Dik za jakekoliv napady a nakopnuti.
--
Lukas Gebauer.
E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.
Odpovedá: Lukas Gebauer
19. 7. 2004 8:05
> Z D8 pres PInvoke volam nejake DLLka.
>
> Jen si nevim rady co si pocit s typem "char**". Ve starych delphi
> staci pouzit "var pchar". Jak to ale udelat v D8?
Odpovim si sam:
Zatimco "char*" se vyrobi sam z typu String, pripadne ze
StringBuilder pro vystupni parametry, tak u "char**" se na to musi
jit trosku jinak:
Je potreba deklarovat takovy parametr jako "var x:IntPtr", tedy jako
odkaz na IntPtr. To je typove presne to co chceme. Jen musime rucne
prevadet retezec na IntPtr, pripadne zpet z IntPtr na retezec pro
vystupni parametry.
Klicove funkce jsou: Marshal.StringToHGlobalAnsi,
Marshal.AllocHGlobal, Marshal.PtrToStringAnsi.
Hlavne nezapomenout po sobe uklizet alokovanou pamet (garbage
collection tady logicky nefunguje!) pomoci Marshal.FreeHGlobal.
--
Lukas Gebauer.
E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.